package facade;

import java.sql.SQLException;
import java.util.List;

import dao.implementations.postgresql.UsuarioDB;
import dao.implementations.postgresql.Administrador.AdministradorDB;
import dao.implementations.postgresql.Administrador.ProyectoDB;
import dao.implementations.postgresql.Curso.CursoDB;
import dao.implementations.postgresql.Docente.DocenteDB;
import dao.implementations.postgresql.Socio.DireccionDB;
import dao.implementations.postgresql.Socio.PautaEvaluacionDB;
import dao.implementations.postgresql.Socio.SocioDB;
import dao.interfaces.IUsuario;
import dao.interfaces.Administrador.IAdministrador;
import dao.interfaces.Administrador.IProyecto;
import dao.interfaces.Curso.ICurso;
import dao.interfaces.Docente.IDocente;
import dao.interfaces.Socio.IDireccion;
import dao.interfaces.Socio.IPautaEvaluacion;
import dao.interfaces.Socio.ISocio;
import dao.transferObjects.*;
import dao.transferObjects.Gae.CursoTO;
import facade.FacadeBase;

public class FacadeUsuario extends FacadeBase 
{
	
	public UsuarioTO obtenerUsuario(int rut, String contrasena)
	{
		UsuarioTO usuario = new UsuarioTO();
		
		IUsuario usuarioDB = new UsuarioDB(this.connection.getConnection());
		
		usuario = usuarioDB.obtenerUsuario(rut, contrasena);
		
		//int a = usuarioDB.guardarHora();
		
		try
		{
			this.connection.getConnection().close();
		}
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		
		System.out.println("Este es el rut: "+usuario.getRut()+"-"+usuario.getVerificador()+" --> "+usuario.getTipo());
		
		return usuario;
	}
	
	public UsuarioTO obtenerUsuarioRut(int rut)
	{
		UsuarioTO usuario = new UsuarioTO();
		
		IUsuario usuarioDB = new UsuarioDB(this.connection.getConnection());
		
		usuario = usuarioDB.obtenerUsuarioRut(rut);
		
		try
		{
			this.connection.getConnection().close();
		}
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		
		if(usuario!=null)
			System.out.println("Este es el rut: "+usuario.getRut()+"-"+usuario.getVerificador()+" --> "+usuario.getTipo());
		else
			System.out.println("Rut no existente");
		
		return usuario;
	}
	
	public UsuarioTO obtenerUsuarioLogeado(int rut, String tipoUsuario)
	{
		UsuarioTO usuario = new UsuarioTO();
		
		IUsuario usuarioDB = new UsuarioDB(this.connection.getConnection());
		
		usuario = usuarioDB.obtenerUsuarioLogeado(rut, tipoUsuario);
		
		try{
			this.connection.getConnection().close();
		}
		catch (SQLException e){
			e.printStackTrace();
		}

		return usuario;
	}
	
	public int registrarUsuario(UsuarioTO usuario)
	{
		int resp = -1; 
		this.connection.setAutoCommit(false);
		
		IUsuario usuarioDB = new UsuarioDB(this.connection.getConnection());
		
		resp = usuarioDB.registrarUsuario(usuario);
		
		if(resp > -1)
		{
			this.connection.commit();
		}
		else
		{
			this.connection.rollback();
		}
	
		try
		{
			this.connection.getConnection().close();
		} 
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		
		return resp;
	}
	
	//SOLO VALIDO PARA ELIMINAR ADMIN, DOCENTE, SOCIO.
	public int eliminarUsuario(UsuarioTO usuario, String tipo)
	{
		int resp = -1;
		
		this.connection.setAutoCommit(false);
		
		IUsuario usuarioDB = new UsuarioDB(this.connection.getConnection());
		IProyecto proyectoDB = new ProyectoDB(this.connection.getConnection());
		ICurso cursoDB = new CursoDB(this.connection.getConnection());
		IPautaEvaluacion pautaEvaluacionDB = new PautaEvaluacionDB(this.connection.getConnection());
		IDireccion direccionDB = new DireccionDB(this.connection.getConnection());
		IAdministrador adminDB = new AdministradorDB(this.connection.getConnection());
		IDocente docenteDB = new DocenteDB(this.connection.getConnection());
		ISocio socioDB = new SocioDB(this.connection.getConnection());
		
		
		if(tipo.equals("administrador")){
			resp = proyectoDB.desAsignarProyectoAdmin(usuario);
			if(resp >= 0){
					resp = adminDB.eliminarAdministrador(usuario.getRut());
				if(resp > 0)
					resp = usuarioDB.eliminarUsuario(usuario);
			}
		}
		
		if(tipo.equals("docente")){
			List<CursoTO> cursosDocente = null;
			cursosDocente = cursoDB.obtenerTodosCursoDocente(usuario);
			if(cursosDocente.size() > 0){
				resp = -3;//IMPLICA QUE NO SE PUEDE ELIMINAR DADO QUE TIENE DEPENDENCIAS
			}
			else{
				resp = docenteDB.eliminarDocente(usuario.getRut());
				if(resp > 0)
					resp = usuarioDB.eliminarUsuario(usuario);
			}
		}
		
		if(tipo.equals("socio comunitario")){
			resp = proyectoDB.desAsignarTODOSProyectoSocio(usuario.getRut());
			if(resp >= 0){// PUEDE SER CERO DADO QUE PUEDE NO TENER ASOCIADO PROYECTOS
				resp = pautaEvaluacionDB.eliminarTODOPautaEvaluacionSocio(usuario.getRut());
				if(resp >= 0){// PUEDE SER CERO DADO QUE PUEDE NO TENER ASOCIADO PAUTAS
					resp = direccionDB.eliminarDireccionSocio(usuario.getRut());
					if(resp > 0)// DEBE SER MAYOR A CERO DADO QUE ES NECESARIO ELIMIAR SU DIRECCION
						resp = socioDB.eliminarSocio(usuario.getRut());
					if(resp > 0)
						resp = usuarioDB.eliminarUsuario(usuario);
				}
			}
		}
		
		if(resp > 0){
			this.connection.commit();
		}
		else{
			this.connection.rollback();
		}
		try{
			this.connection.getConnection().close();
		} 
		catch (SQLException e){
			e.printStackTrace();
		}
		
		return resp;
	}

}
